/* 
perminv.c 
algorytm I, odwracanie permutacji w miejscu
D. E. Knuth, TAOCP, 1.3.3
*/

#define N 6
int x[N + 1] = {0, 6, 2, 1, 5, 4, 3};
void print(); // wydruk

int main()
{
  int i;
  int j; 
  int m;
  print();
 I1: // inicjowanie
  m = N;
  j = -1;
 I2: // nastepny element
  i = x[m];
  if (i < 0) 
    goto I5;
 I3: // odwracanie
  x[m] = j;
  j = -m;
  m = i;
  i = x[m];
 I4: // czy koniec cyklu?
  if (i > 0) 
    goto I3;  
  i = j;
 I5: // zapamietanie wartosci wynikowej
  x[m] = -i;
 I6: // petla wzgledem m
  m = m-1;
  if (m > 0) 
    goto I2; 
  print();
  return 0;
}

void print()
{
  int i;
  for (i = 1; i <= N; i++) 
    printf("%d ", x[i]);
  printf("\n");
}
